//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖保佑             永无BUG 
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//                  不见满街漂亮妹，哪个归得程序员？  


/* ****************************************************************************
 * Author: 671643387
 * Date: 2015/7/3
 * ***************************************************************************/

// 元宝消耗相关统计

exports.total = function(query, resp, callback) {
    var minTime = +query.minTime;   // 查询起始时间
    var maxTime = +query.maxTime;   // 查询结束时间
    var minSid = +query.minSid;     // 起始服务器ID
    var maxSid = +query.maxSid;     // 结束服务器ID

    // 检查参数
    if (isNaN(minTime) || isNaN(maxTime) || isNaN(minSid) || isNaN(maxSid))
    {
        resp.code = 1; resp.desc = 'invalid params';
        callback(); return;
    }

    var minTimeStr = Date.createFromStamp(minTime).stdFormatedString();
    var maxTimeStr = Date.createFromStamp(maxTime).stdFormatedString();

    var platCostSum = 0;

    async.each(gServers.getSids(minSid, maxSid), function(sid, ecb) {
        var db = gServers.getGameDB(sid);
        if (!db) {
            LOG(sid + " no db");
            ecb(null); return;
        }

        async.series([
            function (cb) {
                db.collection('cash').group(
                    {'openid':1},
                    {"time":{
                        "$gte":minTime,
                        "$lt":maxTime
                    }},
                    {sum:0},
                    function(doc, prev){
                        var num = +doc.num;
                        if (num < 0) { // 统计的是消费情况
                            prev.sum += Math.abs(num);
                        }
                    },
                    function(err, results) {
                        if (err || !results) {
                            cb(util.format('server %d dbPay error', sid)); return;
                        }


                        results.forEach(function(value){
                            platCostSum += +value.sum;
                        });
                        cb();
                    }
                );
            },
            function(cb) {
                db.collection('analysis').group(
                    {'uid':1},
                    {"date":{
                        "$gte":minTimeStr,
                        "$lt":maxTimeStr
                    }},
                    {sum:0},
                    function(doc, prev){
                        prev.sum += +doc.cash;
                    },
                    function(err, results) {
                        if (err || !results) {
                            cb(util.format('server %d dbPay error', sid)); return;
                        }

                        results.forEach(function(value){
                            platCostSum += +value.sum;
                        });
                        cb();
                    }
                );
            }
        ], function(err){
            ecb(err);
        });
    }, function(err){
        LOG(err);
        if (err) resp.data = err;
        else resp.data = platCostSum;
        callback();
    });
};